home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / sort < prev    next >
Encoding:
Text File  |  1992-08-15  |  2.1 KB  |  103 lines

  1. int
  2. do_sort(TARG,arg,gimme,arglast)
  3. STR *TARG;
  4. ARG *arg;
  5. int gimme;
  6. int *arglast;
  7. {
  8.     register STR **st = stack->ary_array;
  9.     int sp = arglast[1];
  10.     register STR **up;
  11.     register int max = arglast[2] - sp;
  12.     register int i;
  13.     int sortcmp();
  14.     int sortsub();
  15.     STR *oldfirst;
  16.     STR *oldsecond;
  17.     ARRAY *oldstack;
  18.     HASH *stash;
  19.     STR *sortsubvar;
  20.  
  21.     if (gimme != G_ARRAY) {
  22.     str_sset(TARG,&str_undef);
  23.     STABSET(TARG);
  24.     st[sp] = TARG;
  25.     return sp;
  26.     }
  27.     up = &st[sp];
  28.     sortsubvar = *up;
  29.     st += sp;        /* temporarily make st point to args */
  30.     for (i = 1; i <= max; i++) {
  31.     /*SUPPRESS 560*/
  32.     if (*up = st[i]) {
  33.         if (!(*up)->str_pok)
  34.         (void)str_2ptr(*up);
  35.         else
  36.         (*up)->str_pok &= ~SP_TEMP;
  37.         up++;
  38.     }
  39.     }
  40.     st -= sp;
  41.     max = up - &st[sp];
  42.     sp--;
  43.     if (max > 1) {
  44.     STAB *stab;
  45.  
  46.     if (arg[1].arg_type == (A_CMD|A_DONT)) {
  47.         sortcmd = arg[1].arg_ptr.arg_cmd;
  48.         stash = curcmd->c_stash;
  49.     }
  50.     else {
  51.         if ((arg[1].arg_type & A_MASK) == A_WORD)
  52.         stab = arg[1].arg_ptr.arg_stab;
  53.         else
  54.         stab = stabent(str_get(sortsubvar),TRUE);
  55.  
  56.         if (stab) {
  57.         if (!stab_sub(stab) || !(sortcmd = stab_sub(stab)->cmd))
  58.             fatal("Undefined subroutine \"%s\" in sort", 
  59.             stab_ename(stab));
  60.         stash = stab_estash(stab);
  61.         }
  62.         else
  63.         sortcmd = Nullcmd;
  64.     }
  65.  
  66.     if (sortcmd) {
  67.         int oldtmps_base = tmps_base;
  68.  
  69.         if (!sortstack) {
  70.         sortstack = anew(Nullstab);
  71.         astore(sortstack, 0, Nullstr);
  72.         aclear(sortstack);
  73.         sortstack->ary_flags = 0;
  74.         }
  75.         oldstack = stack;
  76.         stack = sortstack;
  77.         tmps_base = tmps_max;
  78.         if (sortstash != stash) {
  79.         firststab = stabent("a",TRUE);
  80.         secondstab = stabent("b",TRUE);
  81.         sortstash = stash;
  82.         }
  83.         oldfirst = stab_val(firststab);
  84.         oldsecond = stab_val(secondstab);
  85. #ifndef lint
  86.         qsort((char*)(st+sp+1),max,sizeof(STR*),sortsub);
  87. #else
  88.         qsort(Nullch,max,sizeof(STR*),sortsub);
  89. #endif
  90.         stab_val(firststab) = oldfirst;
  91.         stab_val(secondstab) = oldsecond;
  92.         tmps_base = oldtmps_base;
  93.         stack = oldstack;
  94.     }
  95. #ifndef lint
  96.     else
  97.         qsort((char*)(st+sp+1),max,sizeof(STR*),sortcmp);
  98. #endif
  99.     }
  100.     return sp+max;
  101. }
  102.  
  103.